package mMap.hashDemo;

import java.util.HashSet;
import java.util.Set;

/**
* @author jie
* @version 创建时间：2017年11月30日 下午10:36:26
 *
 * http://note.youdao.com/noteshare?id=bbdb3722c7c6229d0dd864065fa3ec5e
 *
* 类说明
*/
public class Demo2 {
	public final static void main(String[] args) {
		HashTest a0 = new HashTest();
		HashTest b0 = new HashTest();
		a0.setI(1);
		b0.setI(1);
		Set<HashTest> set0 = new HashSet<HashTest>();
		set0.add(a0);
		set0.add(b0);
		System.out.println(a0.hashCode() == b0.hashCode());
		System.out.println(a0.equals(b0));
		System.out.println(set0);

		
		//以上这个示例，我们只是重写了HashCode方法，从上面的结果可以看出，虽然两个对象的HashCode相等，
		//但是实际上两个对象并不是相等，因为我们没有重写equals方法，那么就会调用Object默认的equals方法，
		//显示这是两个不同的对象。
		//这里我们将生成的对象放到了HashSet中，而HashSet中只能够存放唯一的对象，
		//也就是相同的（适用于equals方法）的对象只会存放一个，
		//但是这里实际上是两个对象a,b都被放到了HashSet中，这样HashSet就失去了他本身的意义了。
		
		System.out.println("________下面我们继续重写equals方法：________");
		HashTest2 a = new HashTest2();
		HashTest2 b = new HashTest2();
		a.setI(1);
		b.setI(1);
		Set<HashTest2> set = new HashSet<HashTest2>();
		set.add(a);
		set.add(b);
		System.out.println(a.hashCode() == b.hashCode());
		System.out.println(a.equals(b));
		System.out.println(set);
	}

}

class HashTest {
	private int i;

	public int getI() {
		return i;
	}

	public HashTest() {
		// TODO Auto-generated constructor stub
	}

	public void setI(int i) {
		this.i = i;
	}

	public int hashCode() {
		return i % 10;
	}

}

class HashTest2 {


	public HashTest2() {

	}

	private int i;

	public int getI() {
		return i;
	}

	public void setI(int i) {
		this.i = i;
	}

	public boolean equals(Object object) {
		if (object == null) {
			return false;
		}
		if (object == this) {
			return true;
		}
		if (!(object instanceof HashTest2)) {
			return false;
		}
		HashTest2 other = (HashTest2) object;
		if (other.getI() == this.getI()) {
			return true;
		}
		return false;
	}

	public int hashCode() {
		return i % 10;
	}

}